home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / DistUpgrade / DistUpgradeViewText.py < prev    next >
Text File  |  2009-11-02  |  10KB  |  275 lines

  1. # DistUpgradeViewText.py 
  2. #  
  3. #  Copyright (c) 2004-2006 Canonical
  4. #  
  5. #  Author: Michael Vogt <michael.vogt@ubuntu.com>
  6. #  This program is free software; you can redistribute it and/or 
  7. #  modify it under the terms of the GNU General Public License as 
  8. #  published by the Free Software Foundation; either version 2 of the
  9. #  License, or (at your option) any later version.
  10. #  This program is distributed in the hope that it will be useful,
  11. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. #  GNU General Public License for more details.
  14. #  You should have received a copy of the GNU General Public License
  15. #  along with this program; if not, write to the Free Software
  16. #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  17. #  USA
  18.  
  19. import sys
  20. import logging
  21. import subprocess
  22.  
  23. import apt
  24. import os
  25.  
  26. from DistUpgradeView import DistUpgradeView, InstallProgress, FetchProgress
  27. import apt.progress
  28.  
  29. import gettext
  30. from DistUpgradeGettext import gettext as _
  31. #from textwrap import fill, wrap
  32.  
  33. # helpers inspired after textwrap - unfortunately
  34. # we can not use textwrap directly because it break
  35. # packagenames with "-" in them into new lines
  36. def wrap(t, width=70, subsequent_indent=""):
  37.     out = ""
  38.     for s in t.split():
  39.         if (len(out)-out.rfind("\n")) + len(s) > width:
  40.             out += "\n" + subsequent_indent
  41.         out += s + " "
  42.     return out
  43.     
  44. def twrap(s, **kwargs):
  45.     msg = ""
  46.     paras = s.split("\n")
  47.     for par in paras:
  48.         s = wrap(par, **kwargs)
  49.         msg += s+"\n"
  50.     return msg
  51.  
  52. class TextFetchProgress(FetchProgress, apt.progress.TextFetchProgress):
  53.     def __init__(self):
  54.         apt.progress.TextFetchProgress.__init__(self)
  55.         FetchProgress.__init__(self)
  56.     def pulse(self):
  57.         apt.progress.TextFetchProgress.pulse(self)
  58.         FetchProgress.pulse(self)
  59.         return True
  60.  
  61. class TextCdromProgressAdapter(apt.progress.CdromProgress):
  62.     """ Report the cdrom add progress  """
  63.     def update(self, text, step):
  64.         """ update is called regularly so that the gui can be redrawn """
  65.         if text:
  66.           print "%s (%f)" % (text, step/float(self.totalSteps)*100)
  67.     def askCdromName(self):
  68.         return (False, "")
  69.     def changeCdrom(self):
  70.         return False
  71.  
  72.  
  73. class DistUpgradeViewText(DistUpgradeView):
  74.     " text frontend of the distUpgrade tool "
  75.     def __init__(self, datadir=None, logdir=None):
  76.         # its important to have a debconf frontend for
  77.         # packages like "quagga"
  78.         if not os.environ.has_key("DEBIAN_FRONTEND"):
  79.             os.environ["DEBIAN_FRONTEND"] = "dialog"
  80.         if not datadir:
  81.           localedir=os.path.join(os.getcwd(),"mo")
  82.         else:
  83.           localedir="/usr/share/locale/update-manager"
  84.  
  85.         try:
  86.           gettext.bindtextdomain("update-manager", localedir)
  87.           gettext.textdomain("update-manager")
  88.         except Exception, e:
  89.           logging.warning("Error setting locales (%s)" % e)
  90.         
  91.         self.last_step = 0 # keep a record of the latest step
  92.         self._opCacheProgress = apt.progress.OpTextProgress()
  93.         self._fetchProgress = TextFetchProgress()
  94.         self._cdromProgress = TextCdromProgressAdapter()
  95.         self._installProgress = InstallProgress()
  96.         sys.excepthook = self._handleException
  97.         #self._process_events_tick = 0
  98.  
  99.     def _handleException(self, type, value, tb):
  100.       import traceback
  101.       print
  102.       lines = traceback.format_exception(type, value, tb)
  103.       logging.error("not handled exception:\n%s" % "\n".join(lines))
  104.       self.error(_("A fatal error occurred"),
  105.                  _("Please report this as a bug and include the "
  106.                    "files /var/log/dist-upgrade/main.log and "
  107.                    "/var/log/dist-upgrade/apt.log "
  108.                    "in your report. The upgrade is now aborted.\n"
  109.                    "Your original sources.list was saved in "
  110.                    "/etc/apt/sources.list.distUpgrade."),
  111.                  "\n".join(lines))
  112.       sys.exit(1)
  113.  
  114.     def getFetchProgress(self):
  115.         return self._fetchProgress
  116.     def getInstallProgress(self, cache):
  117.         self._installProgress._cache = cache
  118.         return self._installProgress
  119.     def getOpCacheProgress(self):
  120.         return self._opCacheProgress
  121.     def getCdromProgress(self):
  122.         return self._cdromProgress
  123.     def updateStatus(self, msg):
  124.       print
  125.       print msg
  126.       sys.stdout.flush()
  127.     def abort(self):
  128.       print
  129.       print _("Aborting")
  130.     def setStep(self, step):
  131.       self.last_step = step
  132.     def showDemotions(self, summary, msg, demotions):
  133.         self.information(summary, msg, 
  134.                          _("Demoted:\n")+twrap(", ".join(demotions)))
  135.     def information(self, summary, msg, extended_msg=None):
  136.       print
  137.       print twrap(summary)
  138.       print twrap(msg)
  139.       if extended_msg:
  140.         print twrap(extended_msg)
  141.     def error(self, summary, msg, extended_msg=None):
  142.       print
  143.       print twrap(summary)
  144.       print twrap(msg)
  145.       if extended_msg:
  146.         print twrap(extended_msg)
  147.       return False
  148.     def showInPager(self, output):
  149.       " helper to show output in a pager"
  150.       for pager in ["/usr/bin/sensible-pager", "/bin/more"]:
  151.           if os.path.exists(pager):
  152.               p = subprocess.Popen([pager,"-"],stdin=subprocess.PIPE)
  153.               p.stdin.write(output)
  154.               p.stdin.close()
  155.               p.wait()
  156.               return
  157.       # if we don't have a pager, just print
  158.       print output
  159.  
  160.     def confirmChanges(self, summary, changes, downloadSize,
  161.                        actions=None, removal_bold=True):
  162.       DistUpgradeView.confirmChanges(self, summary, changes, downloadSize, actions)
  163.       print
  164.       print twrap(summary)
  165.       print twrap(self.confirmChangesMessage)
  166.       print " %s %s" % (_("Continue [yN] "), _("Details [d]")),
  167.       while True:
  168.         res = sys.stdin.readline()
  169.         # TRANSLATORS: the "y" is "yes"
  170.         if res.strip().lower().startswith(_("y")):
  171.           return True
  172.         # TRANSLATORS: the "n" is "no"
  173.         elif res.strip().lower().startswith(_("n")):
  174.           return False
  175.         # TRANSLATORS: the "d" is "details"
  176.         elif res.strip().lower().startswith(_("d")):
  177.           output = ""
  178.           if len(self.toRemove) > 0:
  179.               output += "\n"  
  180.               output += twrap(_("Remove: %s\n" % " ".join(self.toRemove)), subsequent_indent='  ')
  181.           if len(self.toInstall) > 0:
  182.               output += "\n"
  183.               output += twrap(_("Install: %s\n" % " ".join(self.toInstall)), subsequent_indent='  ')
  184.           if len(self.toUpgrade) > 0:
  185.               output += "\n"  
  186.               output += twrap(_("Upgrade: %s\n" % " ".join(self.toUpgrade)), subsequent_indent='  ')
  187.           self.showInPager(output)
  188.         print "%s %s" % (_("Continue [yN] "), _("Details [d]")),
  189.  
  190.     def askYesNoQuestion(self, summary, msg, default='No'):
  191.       print
  192.       print twrap(summary)
  193.       print twrap(msg)
  194.       if default == 'No':
  195.           print _("Continue [yN] "),
  196.           res = sys.stdin.readline()
  197.           # TRANSLATORS: first letter of a positive (yes) answer
  198.           if res.strip().lower().startswith(_("y")):
  199.               return True
  200.           return False
  201.       else:
  202.           print _("Continue [Yn] "),
  203.           res = sys.stdin.readline()
  204.           # TRANSLATORS: first letter of a negative (no) answer
  205.           if res.strip().lower().startswith(_("n")):
  206.               return False
  207.           return True
  208.  
  209. # FIXME: when we need this most the resolver is writing debug logs
  210. #        and we redirect stdout/stderr    
  211. #    def processEvents(self):
  212. #      #time.sleep(0.2)
  213. #      anim = [".","o","O","o"]
  214. #      anim = ["\\","|","/","-","\\","|","/","-"]
  215. #      self._process_events_tick += 1
  216. #      if self._process_events_tick >= len(anim):
  217. #          self._process_events_tick = 0
  218. #      sys.stdout.write("[%s]" % anim[self._process_events_tick])
  219. #      sys.stdout.flush()
  220.  
  221.     def confirmRestart(self):
  222.       return self.askYesNoQuestion(_("Restart required"),
  223.                                    _("To finish the upgrade, a restart is "
  224.                                      "required.\n"
  225.                                      "If you select 'y' the system "
  226.                                      "will be restarted."), default='No')
  227.  
  228.  
  229. if __name__ == "__main__":
  230.   view = DistUpgradeViewText()
  231.  
  232.   #while True:
  233.   #    view.processEvents()
  234.   
  235.   print twrap("89 packages are going to be upgraded.\nYou have to download a total of 82.7M.\nThis download will take about 10 minutes with a 1Mbit DSL connection and about 3 hours 12 minutes with a 56k modem.", subsequent_indent=" ")
  236.   #sys.exit(1)
  237.  
  238.   view = DistUpgradeViewText()
  239.   print view.askYesNoQuestion("hello", "Icecream?", "No")
  240.   print view.askYesNoQuestion("hello", "Icecream?", "Yes")
  241.   
  242.  
  243.   #view.confirmChangesMessage = "89 packages are going to be upgraded.\n You have to download a total of 82.7M.\n This download will take about 10 minutes with a 1Mbit DSL connection and about 3 hours 12 minutes with a 56k modem."
  244.   #view.confirmChanges("xx",[], 100)
  245.   sys.exit(0)
  246.  
  247.   view.confirmRestart()
  248.  
  249.   cache = apt.Cache()
  250.   fp = view.getFetchProgress()
  251.   ip = view.getInstallProgress(cache)
  252.  
  253.  
  254.   for pkg in sys.argv[1:]:
  255.     cache[pkg].markInstall()
  256.   cache.commit(fp,ip)
  257.   
  258.   sys.exit(0)
  259.   view.getTerminal().call(["dpkg","--configure","-a"])
  260.   #view.getTerminal().call(["ls","-R","/usr"])
  261.   view.error("short","long",
  262.              "asfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\n"
  263.              "asfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\n"
  264.              "asfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\n"
  265.              "asfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\n"
  266.              "asfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\n"
  267.              "asfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\n"
  268.              "asfds afsdj af asdf asdf asf dsa fadsf asdf as fasf sextended\n"
  269.              )
  270.   view.confirmChanges("xx",[], 100)
  271.   print view.askYesNoQuestion("hello", "Icecream?")
  272.